#define _CRT_SECURE_NO_WARNINGS 1

class Foo {
public:
    Foo() {
        sem_init(&_sem1, 0, 0);
        sem_init(&_sem1, 0, 0);
    }

    void first(function<void()> printFirst) {
        // printFirst() outputs "first". Do not change or remove this line.
        printFirst();
        sem_post(&_sem1);
    }

    void second(function<void()> printSecond) {

        // printSecond() outputs "second". Do not change or remove this line.
        sem_wait(&_sem1);
        printSecond();
        sem_post(&_sem2);
    }

    void third(function<void()> printThird) {

        // printThird() outputs "third". Do not change or remove this line.
        sem_wait(&_sem2);
        printThird();
    }
    sem_t _sem1, _sem2;
};